﻿Использование сторонних библиотек
=================================

Yii изначально спроектирован таким образом, чтобы использование сторонних библиотек
с целью расширения функциональности Yii, происходило легко и непринужденно.
Очень часто при использовании в работе сторонних библиотек разработчики сталкиваются с проблемами
именования классов и подключения файлов. Поскольку все классы Yii имеют префикс `C`, то вероятность
возникновения конфликтов имён существенно ниже. А благодаря тому, что для подключения файлов Yii
использует [автозагрузку SPL](http://php.net/manual/en/function.spl-autoload.php), работа с библиотеками,
использующими для подключения файлов классов этот механизм автозагрузки или же относительный путь
подключения в РНР (PHP include path), становится существенно приятнее.

Ниже приведён пример, иллюстрирующий использование в Yii приложении компонента
[Zend_Search_Lucene](http://www.zendframework.com/manual/en/zend.search.lucene.html)
из [Zend Framework](http://www.zendframework.com).

Первым делом, распаковываем релиз с Zend Framework в директорию `protected/vendors`, где `protected` —
это [базовая директория приложения](/doc/guide/basics.application#application-base-directory).
Убедитесь в том, что файл `protected/vendors/Zend/Search/Lucene.php` существует.

Далее, в самом начале файла, содержащего класс контроллера, добавляем строку:

~~~
[php]
Yii::import('application.vendors.*');
require_once('Zend/Search/Lucene.php');
~~~

Код, приведённый выше, подключает файл `Lucene.php`. Поскольку используется относительный путь,
то необходимо изменить относительный путь подключения в РНР (PHP include path) таким образом, чтобы приложение могло
найти файл. Делается это путём вызова метода `Yii::import` перед  `require_once`.

После того как проделано всё описанное, можно использовать класс `Lucene` в действиях контроллера следующим образом:

~~~
[php]
$lucene=new Zend_Search_Lucene($pathOfIndex);
$hits=$lucene->find(strtolower($keyword));
~~~

Подключение библиотек, использующих пространства имён
-----------------------------------------------------

Для того чтобы подключить библиотеку, использующую пространство имён согласно соглашению
[PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)
(например, Zend Framework 2 или Symfony2), необходимо зарегистрировать её корень как псевдоним пути.

В качестве примера будем использовать [Imagine](https://github.com/avalanche123/Imagine).
Если мы скопируем директорию `Imagine` в `protected/vendors`, то использовать библиотеку можно будет следующим
образом:

~~~
[php]
Yii::setPathOfAlias('Imagine',Yii::getPathOfAlias('application.vendors.Imagine'));

// Далее стандартный код из руководства Imagine:
// $imagine = new Imagine\Gd\Imagine();
// и т.д.
~~~

В приведённом выше коде имя заданного нами псевдонима должно соответствовать первой части пространства имён, которое
используется в библиотеке.

Использование стронних загрузчиков классов
------------------------------------------

Некоторые сторонние библиотеки, такие как PHPUnit, используют собственные загрузчики классов, не совместимые с Yii.
Так как загрузчик классов Yii, если класс не удаётся найти, пробует загрузку из include path PHP, то регистрация
сторонних загрузчиков может дать PHP Warning:

~~~
include(PHPUnit_Framework_TestCase.php) [function.include]: failed to open stream: No such file or directory
~~~

Для избежания данной проблемы стоит регистрировать сторонние загрузчики до загрузчика Yii:

~~~
[php]
require_once('PHPUnit/Autoload.php'); // register 3rd-party autoloader
require_once('/path/to/framework/yii.php'); // register Yii autoloader
...
~~~

Если сторонний загрузчик реализован в виде отдельной функции или метода, можно использовать `Yii::registerAutoloader()`
для его регистрации. В этом случае он будет зарегистриован до загрузчика Yii автоматически.

~~~
[php]
require_once('/path/to/framework/yii.php'); // регистрируем загрузчик Yii
...
Yii::registerAutoloader(array('SomeLibrary','autoload')); // регистрируем сторонний загрузчик
...
~~~

Ещё один способ избежать проблем со сторонними загрузчиками — запретить PHP include path выставив
`YiiBase::$enableIncludePath` в `false` до запуска приложения:

~~~
[php]
require_once('/path/to/framework/yii.php');
$configFile='/path/to/config/main.php';
Yii::$enableIncludePath = false; // запрещаем PHP include path
Yii::createWebApplication($configFile)->run();
~~~


Использование Yii в сторонних системах
--------------------------------------

Yii может быть использован как библиотека для разработки и улучшения
сторонних систем, таких как WordPress, Joomla и других. Для того чтобы
воспользоваться Yii, необходимо включить приведённый ниже код в стороннюю систему:

~~~
[php]
require_once('путь/к/yii.php');
Yii::createWebApplication('путь/к/config.php');
~~~

Приведённый код очень похож на тот, который используется в `index.php` обычного
приложения. Отличие состоит в том, что после создания экземпляра приложения не вызывается
метод `run()`.

Теперь при разработке сторонней системы можно использовать большинство
возможностей Yii. Например, для получения доступа к экземпляру приложения
можно использовать `Yii::app()`. Также можно использовать DAO, ActiveRecord
модели, валидацию и т.д.